package tsb.dtd;

import java.util.ArrayList;
import tsb.util.StrCmp;
import tsb.util.StrOp;

/**
 *
 * valida la sintaxis de un attlist
 */
public class ValidadorSintaxisAttList implements IValidadorSintaxis {
    private Diccionario diccionario;
    private ValidadorSintaxisAtributo validadorAtributo;

    public ValidadorSintaxisAttList() {
        diccionario = new Diccionario();
        validadorAtributo = new ValidadorSintaxisAtributo();
    }

    public boolean validar(String aValidar) {
        boolean resultado = true;

        if (StrCmp.isEmpty(aValidar, "<!ATTLIST", ">") == true) {
            resultado = false;
        }
        else if (StrCmp.esInicioFin(aValidar, "<!ATTLIST", ">") == false) {
            resultado = false;
        }
        else if (StrCmp.tieneMasDe(aValidar, "><", 1, true) == true) {
            resultado = false;
        }
        else if (validarNombre(aValidar) == false) {
            resultado = false;
        }
        else if (validarSintaxis(aValidar) == false) {
            resultado = false;
        }
        return resultado;
    }

    private boolean validarNombre(String aValidar) {
        boolean resultado = true;
        String nombre = StrOp.separar(aValidar, " ", "<!ATTLIST", ">", '(', ')')[0];

        if (StrCmp.soloTextosYGuiones(nombre) == false) {
            resultado = false;
        }
        if (diccionario.existe(nombre) == true) {
            resultado = false;
        }
        return resultado;
    }

    private boolean validarSintaxis(String aValidar) {
        boolean resultado = true;
        String[] lista = getDefiniciones(aValidar);

        if (lista == null || lista.length == 0) {
            resultado = false;
        }
        else if (this.validadorAtributo.validar(lista) == false) {
            resultado = false;
        }
        return resultado;
    }

    private String[] getDefiniciones(String str) {
        ArrayList<String> resultado = new ArrayList<String>();
        String[] lista = StrOp.separar(str, " ", "<!ATTLIST", ">", '(', ')');
        int j = 0;
        String agregar = "";

        for (int i = 1; i < lista.length; i++) {
            String aux = lista[i];
            if (j == 3) {
                if (diccionario.existe(aux)) {
                    agregar = agregar + aux + " ";
                }
                else {
                    i--;
                }
                resultado.add(agregar.trim());
                agregar = "";
                j = 0;
            }
            else {
                agregar = agregar + aux + " ";
                j++;
            }
        }

        if (agregar.equals("") == false) {
            resultado.add(agregar.trim());
        }
        return resultado.toArray(new String[resultado.size()]);
    }
}
